import os
from datetime import datetime

from common import constants, exception
from common.LoggerFactory import Log
from service_sms.sdk.dingtalk import DingTalkSDK


class DingTalkMsgApi:

    @staticmethod
    def sent_custom_text_msg(context, message):
        """
        发送自定义文本消息
        :param context: 上下文信息
        :param message: 消息内容
        """
        Log.console().info(f"发送自定义消息，MSG：{message}")
        Log.file().debug(f"准备发送：{message}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            dt_api.send_text_msg(context, access_token, message)
        except Exception as e:
            Log.error(f"自定义消息发送失败，{e}")
            raise exception.ServiceException(f"消息发送失败，{e}")
        Log.file().debug(f"已发送，{message}")

    @staticmethod
    def sent_markdown_msg(context, title, text):
        """
        发送Markdown消息
        :param context: 上下文信息
        :param title: 标题
        :param text: 消息内容
        """
        Log.console().info(f"发送Markdown消息，MSG：{text}")
        Log.file().debug(f"准备发送：{text}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            dt_api.send_markdown_msg(context, access_token, title, text)
        except Exception as e:
            Log.error(f"Markdown消息发送失败，{e}")
            raise exception.ServiceException(f"消息发送失败，{e}")
        Log.file().debug(f"已发送，{text}")

    @staticmethod
    def sent_image_link(context, image_url):
        """
        发送快照链接
        :param context: 上下文信息
        :param image_url: 图片的访问地址
        """
        Log.console().info(f"发送快照链接，URL：{image_url}")
        Log.file().debug(f"准备发送：{image_url}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            dt_api.send_text_msg(context, access_token, image_url)
        except Exception as e:
            Log.error(f"快照链接发送失败，{e}")
            raise exception.ServiceException(f"快照链接发送失败，{e}")
        Log.file().debug(f"已发送，{image_url}")

    @staticmethod
    def sent_image_msg(context, title, image_url):
        """
        发送快照预览图
        :param context: 上下文信息
        :param title: 标题
        :param image_url: 图片的访问地址
        """
        Log.console().info(f"发送快照，标题：{title}")
        Log.file().debug(f"准备发送：{title}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            dt_api.send_markdown_image_msg(context, access_token, title, image_url)
        except Exception as e:
            Log.error(f"快照发送失败，{e}")
            raise exception.ServiceException(f"快照发送失败！")
        Log.file().debug(f"已发送，{title}")

    @staticmethod
    def sent_file_msg(context, file_name, file_content, file_type):
        """
        发送文件
        :param context: 上下文信息
        :param file_name: 文件名称
        :param file_content: base64编码后的文件
        :param file_type: 文件类型 图像、音频、视频、其他
        """
        Log.console().info(f"发送文件，名：{file_name}")
        Log.file().debug(f"准备发送：{file_name}")
        try:
            file_suffix = os.path.splitext(file_name)[1][1:]
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            media_id = dt_api.upload_request(access_token, file_name, file_content, file_type)
            file_name_without_extension = file_name[:file_name.rfind('.')]
            Log.file().info(f"{file_name_without_extension}:{media_id}")
            dt_api.send_file_msg(context, access_token, media_id, file_name, file_suffix)
        except Exception as e:
            Log.error(f"文件发送失败，{e}")
            raise exception.ServiceException(f"文件发送失败！")
        Log.file().debug(f"已发送，{file_name}")

    @staticmethod
    def sent_error_msg(context, program_name):
        """
        发送程序异常消息
        """
        Log.console().info(f"发送程序异常通知，程序：{program_name}")
        Log.file().debug(f"发送异常通知：{program_name}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            now_time = datetime.today().strftime(constants.TIME_FORMAT)
            msg = f"{program_name}程序在{now_time}出现异常，正在尝试重启，请查阅程序日志了解更多！"
            dt_api.send_text_msg(context, access_token, msg)
        except Exception as e:
            Log.error(f"{program_name}发送通知消息失败，{e}")
            raise exception.ServiceException(f"通知消息发送失败！")
        Log.file().debug(f"已发送来自{program_name}的通知")

    @staticmethod
    def sent_cease_msg(context, program_name):
        """
        发送程序停止消息
        """
        Log.console().info(f"发送程序崩溃通知，程序：{program_name}")
        Log.file().debug(f"发送崩溃通知：{program_name}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            msg = f"{program_name}程序的重启次数已达上限，正在停止运行，请工程师尽快处理！"
            dt_api.send_text_msg(context, access_token, msg)
        except Exception as e:
            Log.error(f"{program_name}发送通知消息失败，{e}")
            raise exception.ServiceException(f"通知消息发送失败！")
        Log.file().debug(f"已发送来自{program_name}的通知")

    @staticmethod
    def upload_file(context, file_name, file_content, file_type):
        """
        上传媒体文件到钉钉
        :param context: 上下文信息
        :param file_name: 文件名称
        :param file_content: base64编码后的文件
        :param file_type: 文件类型
        :return 媒体文件上传后获取的唯一标识
        """
        Log.console().info(f"上传媒体文件{file_name}")
        Log.file().debug(f"上传{file_name}")
        try:
            dt_api = DingTalkSDK()
            access_token = dt_api.get_access_token(context)
            resp = dt_api.upload_request(access_token, file_name, file_content, file_type)
            Log.console().info("上传完毕")
            Log.file().debug(f"{file_name}上传完毕")
            return resp
        except Exception as e:
            Log.error(f"媒体文件上传失败，{e}")
            raise exception.ServiceException(f"文件上传失败，{e}")
